/**
 * @param {string} s
 * @return {number}
 */
var lengthOfLongestSubstring = function(s) {
    let map=new Map()
    let count=0
    let tempCount=0
    for(let i=0;i<s.length;i++){
        if(map.has(s[i])){
            //出现重复元素，前面的一定不重复,记录一次最大长度
            count=Math.max(count,tempCount)
            //为了保持不重复，需要把窗口左侧放到第一个重复元素的下一个位置，被移出窗口的其他元素也应该不再纳入是否存在的比较中
            //只能把map中旧窗口的元素清除掉，map.value(即下标）< 新窗口的左侧

            //1.找到上一个重复元素的下标
            let index=map.get(s[i])
            //2.计算新窗口长度
            tempCount=i-index
            //3.保留下标在新窗口中的元素
            // map = new Map([...map].filter(([k, v]) => v > index));
            map.forEach((v,k)=>{
                if(v<index){
                    map.delete(k)
                }
            })
            //4.覆盖重复元素的最新下标
            map.set(s[i],i)

        }else{
            //未出现重复，长度加一，记录已经出现的元素
            tempCount++
            map.set(s[i],i) //记录过程中，会覆盖最开始的元素的下标，则这里记录的元素一定是目前窗口中出现的？
            // 不一定，如果某次重复元素相邻出现，其他旧的节点不会被覆盖，
            // 而且如果新窗口很短，旧窗口很长，旧窗口中出现的元素在新窗口中一定没出现完，反之则是不一定出现过，就没被覆盖
        }
    }
    //最后比较一次
    return Math.max(count,tempCount)
};
let strArr=[["aab",2],["dvdf",3],["abcabcbb",3]]
function test(arr){
    arr.forEach(item=>{
        let count=lengthOfLongestSubstring(item[0])
        console.log(`字符串：${item[0]},预期结果：${item[1]},实际结果：${count}`);
    })
}
test(strArr)
console.log(lengthOfLongestSubstring("abba"));